package com.kuang.single;

/**
 * 单例模式：构造器私有 ，只能创建一个任务管理器
 * 实现方式：
 *      1.饿汉式    一会吃拿过来就加载对象，分配内存空间，但是如果里面声明了固定空间变量，就会造成资源浪费
 *      2.懒汉式     用的时候再分配
 *      3.静态内部类  static修饰获取实例方法
 * 存在问题：
 *      饿汉、懒汉、静态内部类都是不安全的！因为有反射~
 *      反射会破坏单例！！！
 * 解决办法：
 *      枚举类
 *      1.构造器锁住，构造的时候判断下，是否为空，如果存在了，就抛出异常
 *      但是如果通过构造器拿到两个实例，是否是相同的? 不同
 *      2.通过一个标志位，默认false，通过反射newInstance后，设置为true，这时候再次通过反射 newInstance时候，抛出异常
 *      这样是不是没有问题了？
 *      不，可以破坏，拿到标志位字段，破坏私有权限，把标志位的值又改为 false, 单例又就被破坏了
 *      那这个如何解决？
 *      源码  xxx.newInstance() 进去
 *      如果类是一个枚举类型，就不能通过反射创建对象！
 *      为什么枚举能避免单例被破坏？
 *      3.枚举能避免单例被反射破坏，枚举会抛出异常，不能通过反射创建枚举对象
 * 结论：
 *      实现单例最保险的方式：枚举类
 */

// 饿汉式单例
public class HungryMan {

    // 可能会资源浪费
    private byte[] date1 = new byte[1024*1024];
    private byte[] date2 = new byte[1024*1024];
    private byte[] date3 = new byte[1024*1024];
    private byte[] date4 = new byte[1024*1024];
    private byte[] date5 = new byte[1024*1024];

    private final static HungryMan hungryMan = new HungryMan();

    public HungryMan() {
    }

    public static HungryMan getInstance(){
        return hungryMan;
    }
}
